/*

Miranda IM: the free IM client for Microsoft* Windows*

Copyright 2000-2007 Miranda ICQ/IM project, 
all portions of this codebase are copyrighted to the people 
listed in contributors.txt.

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or ( at your option ) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
aLONG with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

*/

#ifndef _UI_CTRL_INCLUDE_
#define _UI_CTRL_INCLUDE_

#include <Richedit.h>
#include <shellapi.h>

#include "icons.h"

/* Ctrl		v0.1.0.3+
structures handling all controls
*/

// control types
#define CTRL_ERROR			0
#define CTRL_EDIT			1
#define CTRL_COMBOBOX_STAT	2
#define CTRL_DATEPICKER		3
#define CTRL_LIST_PROFILE	4
#define CTRL_LIST_ITEM		7

// control flags
#define CTRLF_CHANGED	1
#define CTRLF_HASPROTO	2
#define CTRLF_HASCUSTOM	4
#define CTRLF_HASMETA	8

#define CTRLF_FIRST		16 // first free flag for derived controls

typedef struct TCtrlInfo {
	BYTE	nType;
	WORD	wFlags;
} CTRL, *LPCTRL;

extern COLORREF clrBoth;
extern COLORREF clrChanged;
extern COLORREF clrCustom;
extern COLORREF clrNormal;
extern COLORREF clrMeta;

VOID Ctrl_InitTextColours( VOID );
INT CALLBACK Ctrl_SetTextColour( HDC hdc, WORD wFlags );
INT CALLBACK Ctrl_SetTextColour( HWND hCtrl, HDC hdc );

/**
 *	ctrlCombo.cpp
 **/

/* ComboBox		v0.1.0.3+
everything to handle comboboxes
*/
#define CBF_INITIALIZED	( CTRLF_FIRST )

typedef struct TCBCtrl : CTRL {
	INT					nTopItem;			// index of top most writeable item
	LPIDSTRLIST	pItems;				// pointer to static stringlist
	UINT				nItems;				// number of static items
} CBCTRL, *LPCBCTRL;

// common combobox functions
VOID		ComboBox_Destroy( HWND hDlg, INT idComboBox );
INT			ComboBox_AddItem( HWND hComboBox, LPCTSTR pszText, LPARAM lParam );
INT			ComboBox_InsertItem( HWND hComboBox, INT nIndex, LPCTSTR pszText, LPARAM lParam );
LPARAM	ComboBox_RemoveItem( HWND hComboBox, INT nIndex );
VOID		ComboBox_SelChanged( HWND hDlg, HWND hComboBox );
VOID		ComboBox_CountrySelChanged( HWND hDlg, HWND hComboBox, HWND hIconCtrl );

LPVOID	ComboBox_GetItem( HWND hComboBox, INT nIndex, LPSTR *szText, LPINT ccText, LPARAM *lParam );

// combobox functions for those whose content is static such as country lists, ...
BOOLEAN	ComboBox_AddItems( HWND hComboBox, LPIDSTRLIST pList, UINT numItems, INT nUnspecifiedID, INT nSelectedID, LPCSTR pszSelected );
BYTE		ComboBox_WriteItem( HWND hDlg, INT idCombo, HANDLE hContact, LPCSTR szModule, LPCSTR szBaseProto, LPCSTR szSetting, BYTE bType, BOOLEAN isSigned = FALSE );
BYTE		ComboBox_SelectItem( HWND hDlg, INT idCombo, LPIDSTRLIST pItems, UINT numItems, HANDLE hContact, LPCSTR szModule, LPCSTR szBaseProto, LPCSTR szSetting, INT errorValue, BOOLEAN isSigned = FALSE );
VOID		ComboBox_DropDown( HWND hComboBox );

/**
 *	ctrlEdit.cpp
 **/

/* EditBox		v0.1.0.3+
everything to handle editboxes
*/
typedef struct TEditCtrl : CTRL {
	BYTE	valueType;
} ECTRL, *LPECTRL;

LPECTRL	Edit_Init( HANDLE hContact, HWND hEdit );
BYTE		Edit_SetValue( HWND hDlg, INT idEdit, HANDLE hContact, LPCSTR szModule, LPCSTR szBaseProto, LPCSTR szSetting );
BYTE		Edit_WriteValue( HWND hDlg, INT idEdit, HANDLE hContact, LPCSTR szModule, LPCSTR szBaseProto, LPCSTR szSetting, BYTE bType = DBVT_WCHAR );
VOID		Edit_Changed( HWND hDlg, INT idEdit, LPCSTR szModule, LPCSTR szSetting );
VOID		Edit_Destroy( HWND hDlg, INT idEdit );
VOID		Edit_OpenUrl( HWND hDlg, INT idEdit );
LRESULT Edit_LinkNotificationHandler( HWND hDlg, ENLINK* lnk );

// richedit uses different methods to read and write text
#ifdef _UNICODE
# define CP_TCHAR					1200
#else
# define CP_TCHAR					CP_ACP
#endif

BYTE	RichEdit_SetValue( HWND hDlg, INT idEdit, HANDLE hContact, LPCSTR szModule, LPCSTR szBaseProto, LPCSTR szSetting );
VOID	RichEdit_WriteValue( HWND hDlg, INT idEdit, HANDLE hContact, LPCSTR szModule, LPCSTR szBaseProto, LPCSTR szSetting );
VOID	RichEdit_Changed( HWND hDlg, INT idEdit, LPCSTR szModule, LPCSTR szSetting );

/**
 *	ctrlContact.cpp
 **/

/* contact control	v0.1.0.6+
*/
#define UINFOCOMBOEXCLASS	_T( "UInfoComboExWndClass" )

// messages
#define CBEXM_ADDITEM				( WM_USER+4 )
#define CBEXM_GETITEM				( WM_USER+5 )
#define CBEXM_SETITEM				( WM_USER+6 )
#define CBEXM_DELITEM				( WM_USER+7 )
#define CBEXM_DELALLITEMS		( WM_USER+8 )
#define CBEXM_ISCHANGED			( WM_USER+9 )
#define CBEXM_RESETCHANGED	( WM_USER+10 )
#define CBEXM_SETCURSEL			( WM_USER+11 )
#define CBEXM_SORT					( WM_USER+12 )
#define CBEXM_ENABLEITEM		( WM_USER+13 )

// item masks
#define CBEXIM_FLAGS			0x0001
#define CBEXIM_CAT				0x0002
#define CBEXIM_VAL				0x0004
#define CBEXIM_ICONTEXT		0x0008
#define CBEXIM_ID					0x0010
#define CBEXIM_ALL				( CBEXIM_ID|CBEXIM_ICONTEXT|CBEXIM_CAT|CBEXIM_VAL|CBEXIM_FLAGS )

#define CBEXIF_CATREADONLY	( CTRLF_FIRST )
#define CBEXIF_SMS					( CTRLF_FIRST * 2 )
#define CBEXIF_DELETED			( CTRLF_FIRST * 4 )

typedef struct TComboExItem
{
	WORD		wMask;			// determines which element of this structure is valid
	WORD		wFlags;			// standard control flags
	INT			iItem;			// position of the item in the data array
	DWORD		dwID;				// unique number for each setting read from db to identify it, new entries have dwID = 0
	LPTSTR	pszCat;			// pointer to a descriptive category string to set or retrieve for the data entry
	WORD		ccCat;
	LPTSTR	pszVal;
	WORD		ccVal;
	LPCSTR	pszIcon;
} CBEXITEM, *LPCBEXITEM;

INT	CbEx_LoadModule();
INT CbEx_UnLoadModule();
INT CbEx_AddItemFromDB( HWND hCtrl, LPCSTR szIcon, LPTSTR szItem, HANDLE hContact, LPCSTR szModule, LPCSTR szBaseProto, LPCSTR szSettingVal );
INT CbEx_AddMyItemsFromDB( HWND hCtrl, LPCSTR szIcon, WORD wForcedFlags, HANDLE hContact, LPCSTR szModule, LPCSTR szBaseProto, LPCSTR szFormatCat, LPCSTR szFormatVal );
INT CbEx_WriteItemToDB( HWND hCtrl, HANDLE hContact, LPCSTR szModule, LPCSTR szBaseProto, LPCSTR szSetting );
INT CbEx_WriteMyItemsToDB( HWND hCtrl, INT iFirstItem, HANDLE hContact, LPCSTR szModule, LPCSTR szBaseProto, LPCSTR szFormatCat, LPCSTR szFormatVal );



namespace NCtrl 
{
	namespace TzCombo 
	{
		VOID Init				( HWND hCtrl );
		VOID Select			( HWND hCtrl, HANDLE hContact, LPCSTR szProto );
		VOID Write			( HWND hCtrl, HANDLE hContact, LPCSTR szProto );
		VOID Selchange	( HWND hCtrl );
		VOID Destroy		( HWND hCtrl );
		VOID GetTime		( HWND hCtrl, LPTSTR szTime, WORD cchTime );

	} /* namespace TzCombo */

} /* namespace NCtrl */


#endif /* _UI_CTRL_INCLUDE_ */